//
//  LayerTransform3DViewController.m
//  CoreAnimation
//
//  Created by 张国文 on 16/10/10.
//  Copyright © 2016年 hangzhouyijiyin. All rights reserved.
//

#import "LayerTransform3DViewController.h"

@interface LayerTransform3DViewController ()

@property (nonatomic, strong) UIImageView *peopleImage; // 不采用M34进行旋转
@property (nonatomic, strong) UIImageView *peopleImage2; // 采用M34进行旋转
@property (nonatomic, strong) UIView *backgroudView;

@end

@implementation LayerTransform3DViewController

/**
 *  x轴向右，y轴向下，z轴向外(即指向我们) x轴默认按照方向逆时针，y轴默认按照方向逆时针，z轴默认按照方向逆时针。即：x轴旋转方向向下、y轴旋转方向向右、z轴旋转方向顺时针。
 */

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    self.backgroudView = [[UIView alloc] initWithFrame:self.view.frame];
    self.backgroudView.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.5];
    [self.view addSubview:_backgroudView];
    
    self.peopleImage = [[UIImageView alloc] initWithFrame:CGRectMake(30, 50, 150, 150)];
     self.peopleImage.image = [UIImage imageWithName:@"snowMan"];
    self.peopleImage.backgroundColor = [UIColor redColor];
    [self.backgroudView addSubview:_peopleImage];
    
    self.peopleImage2 = [[UIImageView alloc] initWithFrame:CGRectMake(220, 50, 150, 150)];
    self.peopleImage2.image = [UIImage imageWithName:@"snowMan"];
    self.peopleImage2.backgroundColor = [UIColor redColor];
    [self.backgroudView addSubview:_peopleImage2];
    
    
   
    NSLog(@"改变position之前，peopleImage2的position:%@,锚点：%@, peopleImage2的center：%@，peopleImage2的frame：%@", [NSValue valueWithCGPoint:self.peopleImage2.layer.position], [NSValue valueWithCGPoint: self.peopleImage2.layer.anchorPoint], [NSValue valueWithCGPoint:self.peopleImage2.center],  [NSValue valueWithCGRect:self.peopleImage2.frame]);
    self.peopleImage2.layer.position = CGPointMake(250, 350);
      NSLog(@"改变position之后，peopleImage2的position:%@,锚点：%@, peopleImage2的center：%@，peopleImage2的frame：%@", [NSValue valueWithCGPoint:self.peopleImage2.layer.position], [NSValue valueWithCGPoint: self.peopleImage2.layer.anchorPoint], [NSValue valueWithCGPoint:self.peopleImage2.center],  [NSValue valueWithCGRect:self.peopleImage2.frame]);
    // 改变锚点
    self.peopleImage2.layer.anchorPoint = CGPointMake(1, 0.5);
    NSLog(@"改变anchorPoint之后，peopleImage2的position:%@,锚点：%@, peopleImage2的center：%@，peopleImage2的frame：%@", [NSValue valueWithCGPoint:self.peopleImage2.layer.position], [NSValue valueWithCGPoint: self.peopleImage2.layer.anchorPoint], [NSValue valueWithCGPoint:self.peopleImage2.center],  [NSValue valueWithCGRect:self.peopleImage2.frame]);
    // 结论：改变view的layer层的positon，对视图的center、frame也会产生影响,而改变anchorPoint不会对positon、center产生影响,但是会对frame产生影响，即frame使眼见图片移动到哪里，frame就是哪里
    
    // 添加仿射矩阵
    UIButton *addTransform3DButton = [UIButton buttonWithType:UIButtonTypeCustom];
    addTransform3DButton.frame = CGRectMake(20, 500, 180, 30);
    [addTransform3DButton setTitle:@"添加Transform3D矩阵" forState:UIControlStateNormal];
    [addTransform3DButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [addTransform3DButton addTarget:self action:@selector(addTransform3D:) forControlEvents:UIControlEventTouchUpInside];
    [self.backgroudView addSubview:addTransform3DButton];
    
    // 恢复原状
    UIButton *deleteTransform3DButton = [UIButton buttonWithType:UIButtonTypeCustom];
    deleteTransform3DButton.frame = CGRectMake(220, 500, 100, 30);
    [deleteTransform3DButton setTitle:@"恢复原状" forState:UIControlStateNormal];
    [deleteTransform3DButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [deleteTransform3DButton addTarget:self action:@selector(deleteTransform3D:) forControlEvents:UIControlEventTouchUpInside];
    [self.backgroudView addSubview:deleteTransform3DButton];
}

- (void)addTransform3D:(UIButton *)button
{
    
    // 不使用m34进行y轴旋转，这样看起来非常失真，因为这个整体看起来是图片的宽度变窄而不是旋转，其实已经图层已经按照Y轴旋转45度了。
    self.peopleImage.layer.transform = CATransform3DMakeRotation(M_PI / 4, 0, 1, 0);
    
    
    // 采用M34将图片的Y轴旋转45度
    CATransform3D transform3D = CATransform3DIdentity;
    transform3D.m34 = -1.0 / 500.0;
    transform3D = CATransform3DRotate(transform3D, M_PI / 4, 0, 1, 0);
    self.peopleImage2.layer.transform = transform3D;
    
#pragma mark - 什么是m34
    /**
     *
     在真实世界中，当物体远离我们的时候，由于视角的原因看起来会变小，理论上说远离我们的视图的边要比靠近视角的边跟短，但实际上并没有发生，而我们当前的视角是等距离的，也就是在3D变换中任然保持平行，和之前提到的仿射变换类似。
     
     在等距投影中，远处的物体和近处的物体保持同样的缩放比例，这种投影也有它自己的用处（例如建筑绘图，颠倒，和伪3D视频），但当前我们并不需要。
     
     为了做一些修正，我们需要引入投影变换（又称作z变换）来对除了旋转之外的变换矩阵做一些修改，Core Animation并没有给我们提供设置透视变换的函数，因此我们需要手动修改矩阵值，幸运的是，很简单：
     
     CATransform3D的透视效果通过一个矩阵中一个很简单的元素来控制：m34。m34（图5.9）用于按比例缩放X和Y的值来计算到底要离视角多远。
     */
#pragma mark - m34一般情况的取值范围
    /**
     *m34的默认值是0，我们可以通过设置m34为-1.0 / d来应用透视效果，d代表了想象中视角相机和屏幕之间的距离，以像素为单位，那应该如何计算这个距离呢？实际上并不需要，大概估算一个就好了。
     
     因为视角相机实际上并不存在，所以可以根据屏幕上的显示效果自由决定它的防止的位置。通常500-1000就已经很好了，但对于特定的图层有时候更小后者更大的值会看起来更舒服，减少距离的值会增强透视效果，所以一个非常微小的值会让它看起来更加失真，然而一个非常大的值会让它基本失去透视效果
     结论：一般来说d值取500~1000，如果大于500对于一些图层效果更好，但是一般不用大于500，通常的话取500，即m34=-1/500.0，
     */
}

- (void)deleteTransform3D:(UIButton *)button
{
    self.peopleImage.layer.transform = CATransform3DIdentity;
    self.peopleImage2.layer.transform = CATransform3DIdentity;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
